package br.com.farmabid.component;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.InputMismatchException;
import java.util.regex.Matcher;

public class StringUteis {
	
	public static boolean isCPF(String CPF) {
	// considera-se erro CPF's formados por uma sequencia de numeros iguais
	    if (CPF.equals("00000000000") || CPF.equals("11111111111") ||
	        CPF.equals("22222222222") || CPF.equals("33333333333") ||
	        CPF.equals("44444444444") || CPF.equals("55555555555") ||
	        CPF.equals("66666666666") || CPF.equals("77777777777") ||
	        CPF.equals("88888888888") || CPF.equals("99999999999") ||
	       (CPF.length() != 11))
	       return(false);

	    char dig10, dig11;
	    int sm, i, r, num, peso;

	// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
	    try {
	// Calculo do 1o. Digito Verificador
	      sm = 0;
	      peso = 10;
	      for (i=0; i<9; i++) {              
	// converte o i-esimo caractere do CPF em um numero:
	// por exemplo, transforma o caractere '0' no inteiro 0         
	// (48 eh a posicao de '0' na tabela ASCII)         
	        num = (int)(CPF.charAt(i) - 48); 
	        sm = sm + (num * peso);
	        peso = peso - 1;
	      }

	      r = 11 - (sm % 11);
	      if ((r == 10) || (r == 11))
	         dig10 = '0';
	      else dig10 = (char)(r + 48); // converte no respectivo caractere numerico

	// Calculo do 2o. Digito Verificador
	      sm = 0;
	      peso = 11;
	      for(i=0; i<10; i++) {
	        num = (int)(CPF.charAt(i) - 48);
	        sm = sm + (num * peso);
	        peso = peso - 1;
	      }

	      r = 11 - (sm % 11);
	      if ((r == 10) || (r == 11))
	         dig11 = '0';
	      else dig11 = (char)(r + 48);

	// Verifica se os digitos calculados conferem com os digitos informados.
	      if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10)))
	         return(true);
	      else return(false);
	    } catch (InputMismatchException erro) {
	        return(false);
	    }
	  }
	
	public static boolean isCNPJ(String CNPJ) {
		// considera-se erro CNPJ's formados por uma sequencia de numeros iguais
		    if (CNPJ.equals("00000000000000") || CNPJ.equals("11111111111111") ||
		        CNPJ.equals("22222222222222") || CNPJ.equals("33333333333333") ||
		        CNPJ.equals("44444444444444") || CNPJ.equals("55555555555555") ||
		        CNPJ.equals("66666666666666") || CNPJ.equals("77777777777777") ||
		        CNPJ.equals("88888888888888") || CNPJ.equals("99999999999999") ||
		       (CNPJ.length() != 14))
		       return(false);

		    char dig13, dig14;
		    int sm, i, r, num, peso;

		// "try" - protege o código para eventuais erros de conversao de tipo (int)
		    try {
		// Calculo do 1o. Digito Verificador
		      sm = 0;
		      peso = 2;
		      for (i=11; i>=0; i--) {
		// converte o i-ésimo caractere do CNPJ em um número:
		// por exemplo, transforma o caractere '0' no inteiro 0
		// (48 eh a posição de '0' na tabela ASCII)
		        num = (int)(CNPJ.charAt(i) - 48);
		        sm = sm + (num * peso);
		        peso = peso + 1;
		        if (peso == 10)
		           peso = 2;
		      }

		      r = sm % 11;
		      if ((r == 0) || (r == 1))
		         dig13 = '0';
		      else dig13 = (char)((11-r) + 48);

		// Calculo do 2o. Digito Verificador
		      sm = 0;
		      peso = 2;
		      for (i=12; i>=0; i--) {
		        num = (int)(CNPJ.charAt(i)- 48);
		        sm = sm + (num * peso);
		        peso = peso + 1;
		        if (peso == 10)
		           peso = 2;
		      }

		      r = sm % 11;
		      if ((r == 0) || (r == 1))
		         dig14 = '0';
		      else dig14 = (char)((11-r) + 48);

		// Verifica se os dígitos calculados conferem com os dígitos informados.
		      if ((dig13 == CNPJ.charAt(12)) && (dig14 == CNPJ.charAt(13)))
		         return(true);
		      else return(false);
		    } catch (InputMismatchException erro) {
		        return(false);
		    }
		  }

	/**
	 * Esta fun��o deixa a string apenas com n�meros!!!
	 * @author marcus.antonio
	 * @param string String
	 * @return stringLimpa String
	 * */
	public static String limpaString(String string) {
		
		String stringLimpa = "";
		if (!isEmpty(string)) {
			java.util.regex.Pattern m = java.util.regex.Pattern.compile("[A-z.:</?-]");
			Matcher m1 =  m.matcher(string);
			stringLimpa = m1.replaceAll("");
			stringLimpa = stringLimpa.replace("�", "");
			stringLimpa = stringLimpa.replace("+", "").trim();
			
			try {
				char first = stringLimpa.charAt(0);
				if((int)first == 160) {
					stringLimpa = stringLimpa.substring(1, stringLimpa.length());
				}
			} catch (StringIndexOutOfBoundsException e) {
			}
		}
		
		return stringLimpa;
	}
	
	/**
	 * Esta fun��o deixa a string apenas com n�meros!!!
	 * @author marcus.antonio
	 * @param string String
	 * @return stringLimpa String
	 * */
	public static String limpaStringTelefone(String string) {
		
		String stringLimpa = "";
		if (!isEmpty(string)) {
			java.util.regex.Pattern m = java.util.regex.Pattern.compile("[A-z. \"}{</-]");
			Matcher m1 =  m.matcher(string);
			stringLimpa = m1.replaceAll("");
			stringLimpa = stringLimpa.replace("+", "");
		}
		
		return stringLimpa;
	}
	
	/** [Marcus] Esta fun��o remove todos os n�meros e a pontua��o de uma string
	 * usando express�o regular.
	 * */
	public static String removeNumeroPontuacao(String string) {
		
		String stringLimpa = "";
		if (!"".equals(string) && string != null) {
			java.util.regex.Pattern m = java.util.regex.Pattern.compile("[0-9\t.,:]");
			Matcher m1 =  m.matcher(string);
			stringLimpa = m1.replaceAll("");
		}
		
		return stringLimpa;
	}
	
	
	 /** [Marcus] Verifica se a string est� vazia ou se � nula. Retorna true
	   * se ela TIVER algo, se for nula ou estiver vazia retorna FALSE.
	   * @author marcus.antonio
	   * @param String string - String a ser verificada.
	   * */
	  public static boolean isEmpty (String string){
		  if("".equals(string) || string == null || string.isEmpty()){
			  return true;
		  }else{
			  return false;
		  }
	  }
	  
	  public static boolean isNumber (String str) {
		  try {
				Integer.parseInt(str);
				return true;
			} catch (NumberFormatException e) {
				return false;
			}
	  }
	  
	public static int converteStrInt (String str) {
		int retorno = 0;
		if (!isEmpty(str)) {
			str = str.trim();
			str = limpaString(str);
			try {
				retorno = Integer.parseInt(str);
			} catch (NumberFormatException e) {
				/* TODO [Marcus] Remover para produ��o
				 * */
				e.printStackTrace();
				System.out.println(str);
			}
		}
		return retorno;
	}
	
	public static Date convertStrUtilDate (String str) {
		if (!isEmpty(str)) {
		    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		    try {
				Date dataConvertida = dateFormat.parse(str);
				return dataConvertida;
			} catch (ParseException e) { }
	    }
		
		return null;
	}
	
	public static double convertStrDouble (String str) {
		double retorno = 0;
		try {
			retorno = Double.parseDouble(str);
		} catch (NumberFormatException e) {
		} catch (NullPointerException e) {
		}
		
		return retorno;
	}
	
	public static String trataStringPreco (String preco) {
		if (!StringUteis.isEmpty(preco)) {
			preco = StringUteis.limpaString(preco);
			preco = preco.replace("R$", "");
			preco = preco.replace("$", "");
			if (preco.contains(".")) {
				if (preco.contains(",")) {
					preco = preco.replace(".", "");
					preco = preco.replace(",", ".");
				} else {
					String[] campos = preco.split("\\.");
					if (campos[1].length() > 2) {
						preco = preco.replace(".", "");
						preco = preco + ".00";
					}
				}
			} else {
				if (preco.contains(",")) {
					preco = preco.replace(",", ".");
				} else {
					preco = preco + ".00";
				}
			}
			preco = preco.trim();
		}
		
		return preco;
	}
}
